#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Word文档转Markdown工具 - GUI版本
提供简单易用的图形界面
支持.doc和.docx格式
"""

import tkinter as tk
from tkinter import ttk, filedialog, messagebox, scrolledtext
import threading
import os
from pathlib import Path
from word2md import Word2MarkdownConverter


class Word2MarkdownGUI:
    """Word转Markdown GUI界面"""
    
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("Word转Markdown工具 - 支持.doc/.docx")
        self.root.geometry("600x500")
        self.root.resizable(True, True)
        
        # 创建转换器实例
        self.converter = Word2MarkdownConverter()
        
        # 设置界面
        self.setup_ui()
        
    def setup_ui(self):
        """设置用户界面"""
        # 主框架
        main_frame = ttk.Frame(self.root, padding="10")
        main_frame.grid(row=0, column=0, sticky="nsew")
        
        # 配置网格权重
        self.root.columnconfigure(0, weight=1)
        self.root.rowconfigure(0, weight=1)
        for i in range(9):
            main_frame.rowconfigure(i, weight=0)
        main_frame.columnconfigure(1, weight=1)
        main_frame.rowconfigure(7, weight=1)  # 日志区可扩展
        
        # 标题
        title_label = ttk.Label(main_frame, text="Word文档转Markdown工具", 
                               font=("Arial", 16, "bold"))
        title_label.grid(row=0, column=0, columnspan=3, pady=(0, 5))
        
        # 支持格式提示
        format_label = ttk.Label(main_frame, text="支持格式：.doc, .docx", 
                                font=("Arial", 10), foreground="gray")
        format_label.grid(row=1, column=0, columnspan=3, pady=(0, 10))
        
        # 输入文件选择
        ttk.Label(main_frame, text="输入文件:").grid(row=2, column=0, sticky=tk.W, pady=5)
        self.input_var = tk.StringVar()
        input_entry = ttk.Entry(main_frame, textvariable=self.input_var, width=50)
        input_entry.grid(row=2, column=1, sticky="we", padx=5, pady=5)
        ttk.Button(main_frame, text="浏览", 
                  command=self.browse_input).grid(row=2, column=2, padx=5, pady=5)
        
        # 输出目录选择
        ttk.Label(main_frame, text="输出目录:").grid(row=3, column=0, sticky=tk.W, pady=5)
        self.output_var = tk.StringVar()
        output_entry = ttk.Entry(main_frame, textvariable=self.output_var, width=50)
        output_entry.grid(row=3, column=1, sticky="we", padx=5, pady=5)
        ttk.Button(main_frame, text="浏览", 
                  command=self.browse_output).grid(row=3, column=2, padx=5, pady=5)
        
        # 选项框架
        options_frame = ttk.LabelFrame(main_frame, text="选项", padding="5")
        options_frame.grid(row=4, column=0, columnspan=3, sticky="we", pady=10)
        options_frame.columnconfigure(0, weight=1)
        
        # 批量转换选项
        self.batch_var = tk.BooleanVar()
        batch_check = ttk.Checkbutton(options_frame, text="批量转换模式（处理目录中的所有Word文档）", 
                                     variable=self.batch_var, command=self.toggle_batch_mode)
        batch_check.grid(row=0, column=0, sticky=tk.W)
        
        # 转换引擎选择
        engine_frame = ttk.Frame(options_frame)
        engine_frame.grid(row=1, column=0, sticky=tk.W, pady=5)
        
        ttk.Label(engine_frame, text="转换引擎:").pack(side=tk.LEFT)
        
        self.engine_var = tk.StringVar()
        
        # 检查可用的转换器
        converter_info = self.converter.get_converter_info()
        
        if converter_info['pandoc_available']:
            self.engine_var.set("auto")
            engines = [("自动选择", "auto"), ("Pandoc (推荐)", "pandoc"), ("内置转换器", "builtin")]
        else:
            self.engine_var.set("builtin")
            engines = [("内置转换器", "builtin")]
        
        for text, value in engines:
            radio = ttk.Radiobutton(engine_frame, text=text, variable=self.engine_var, value=value)
            radio.pack(side=tk.LEFT, padx=10)
        
        # 显示转换器状态
        status_lines = []
        status_lines.append(f"支持格式: {', '.join(converter_info['supported_formats'])}")
        status_lines.append(f"可用转换器: 内置✅, Pandoc{'✅' if converter_info['pandoc_available'] else '❌'}")
        if converter_info['doc_tools']:
            status_lines.append(f".doc支持工具: {', '.join(converter_info['doc_tools'])}")
        
        for i, status_text in enumerate(status_lines):
            status_label = ttk.Label(options_frame, text=status_text, font=("Arial", 9))
            status_label.grid(row=2+i, column=0, sticky=tk.W, pady=1)
        
        # 安装指南按钮
        button_row = 2 + len(status_lines)
        if not converter_info['pandoc_available'] or not converter_info['doc_tools']:
            install_button = ttk.Button(options_frame, text="安装指南", 
                                      command=self.show_install_guide)
            install_button.grid(row=button_row, column=0, sticky=tk.W, pady=2)
        
        # 转换按钮
        self.convert_button = ttk.Button(main_frame, text="开始转换", 
                                        command=self.start_conversion, style="Accent.TButton")
        self.convert_button.grid(row=5, column=0, columnspan=3, pady=(5, 5))
        
        # 进度条
        self.progress = ttk.Progressbar(main_frame, mode='indeterminate')
        self.progress.grid(row=6, column=0, columnspan=3, sticky="we", pady=(0, 5))
        
        # 日志区域
        log_frame = ttk.LabelFrame(main_frame, text="转换日志", padding="5")
        log_frame.grid(row=7, column=0, columnspan=3, sticky="nsew", pady=10)
        log_frame.columnconfigure(0, weight=1)
        log_frame.rowconfigure(0, weight=1)
        
        self.log_text = scrolledtext.ScrolledText(log_frame, height=10, wrap=tk.WORD)
        self.log_text.grid(row=0, column=0, sticky="nsew")
        
        # 底部按钮框架
        button_frame = ttk.Frame(main_frame)
        button_frame.grid(row=8, column=0, columnspan=3, pady=5)
        
        ttk.Button(button_frame, text="清空日志", 
                  command=self.clear_log).pack(side=tk.LEFT, padx=5)
        ttk.Button(button_frame, text="关于", 
                  command=self.show_about).pack(side=tk.LEFT, padx=5)
        ttk.Button(button_frame, text="退出", 
                  command=self.root.quit).pack(side=tk.RIGHT, padx=5)
    
    def browse_input(self):
        """浏览输入文件或目录"""
        if self.batch_var.get():
            # 批量模式：选择目录
            directory = filedialog.askdirectory(title="选择包含Word文档的目录")
            if directory:
                self.input_var.set(directory)
        else:
            # 单文件模式：选择文件
            filename = filedialog.askopenfilename(
                title="选择Word文档",
                filetypes=[
                    ("Word文档", "*.docx;*.doc"), 
                    ("新版Word文档", "*.docx"), 
                    ("旧版Word文档", "*.doc"), 
                    ("所有文件", "*.*")
                ]
            )
            if filename:
                self.input_var.set(filename)
    
    def browse_output(self):
        """浏览输出目录"""
        directory = filedialog.askdirectory(title="选择输出目录")
        if directory:
            self.output_var.set(directory)
    
    def toggle_batch_mode(self):
        """切换批量模式"""
        # 清空当前输入
        self.input_var.set("")
        
        # 更新界面提示
        if self.batch_var.get():
            self.log("切换到批量转换模式")
        else:
            self.log("切换到单文件转换模式")
    
    def log(self, message):
        """添加日志消息"""
        self.log_text.insert(tk.END, f"{message}\n")
        self.log_text.see(tk.END)
        self.root.update_idletasks()
    
    def clear_log(self):
        """清空日志"""
        self.log_text.delete(1.0, tk.END)
    
    def show_about(self):
        """显示关于信息"""
        converter_info = self.converter.get_converter_info()
        pandoc_status = "✅ 已安装" if converter_info['pandoc_available'] else "❌ 未安装"
        doc_tools_status = f"✅ {len(converter_info['doc_tools'])}个工具" if converter_info['doc_tools'] else "❌ 未安装"
        
        about_text = f"""Word转Markdown工具 v2.1

功能特点：
• 支持.doc和.docx格式文档转换
• 三重转换策略：Pandoc + 格式转换 + 文本提取
• 保留文档格式（标题、加粗、斜体等）
• 支持表格、图片转换（Pandoc）
• 支持批量转换
• 简单易用的图形界面

转换引擎：
• 内置转换器：✅ 可用（基于python-docx）
• Pandoc转换器：{pandoc_status}
• .doc支持工具：{doc_tools_status}

支持的.doc转换工具：
• LibreOffice（推荐）
• Microsoft Word + doc2docx
• antiword（Linux/macOS）
• catdoc（Linux/macOS）
• docx2txt

使用方法：
1. 选择要转换的Word文档或目录
2. 选择转换引擎（推荐自动选择）
3. 选择输出目录（可选）
4. 点击"开始转换"

转换策略（.doc文件）：
1. Pandoc直接转换（如果可用）
2. 转换为.docx后再转换
3. 提取纯文本并转换为Markdown

作者：AI助手
版本：2.1 - 完整.doc/.docx支持
"""
        messagebox.showinfo("关于", about_text)
    
    def show_install_guide(self):
        """显示安装指南"""
        guide_text = """安装指南

=== Pandoc安装（强烈推荐）===
Pandoc可以大幅提升转换质量。

Windows：
• 官网下载：https://pandoc.org/installing.html
• 包管理器：choco install pandoc 或 scoop install pandoc

macOS：
• brew install pandoc

Linux：
• Ubuntu/Debian: sudo apt-get install pandoc
• CentOS/RHEL: sudo yum install pandoc

=== .doc文件支持工具 ===

LibreOffice（推荐，免费）：
• Windows: https://www.libreoffice.org/download/
• macOS: brew install --cask libreoffice
• Linux: sudo apt-get install libreoffice

其他工具：
• doc2docx: pip install doc2docx（需要MS Word）
• antiword: sudo apt-get install antiword（Linux/macOS）
• catdoc: sudo apt-get install catdoc（Linux/macOS）

安装完成后重启程序即可自动检测。

点击"确定"打开Pandoc官网。
"""
        result = messagebox.askokcancel("安装指南", guide_text)
        if result:
            import webbrowser
            webbrowser.open("https://pandoc.org/installing.html")
    
    def start_conversion(self):
        """开始转换"""
        input_path = self.input_var.get().strip()
        output_path = self.output_var.get().strip()
        
        if not input_path:
            messagebox.showerror("错误", "请选择输入文件或目录")
            return
        
        if not os.path.exists(input_path):
            messagebox.showerror("错误", f"输入路径不存在: {input_path}")
            return
        
        # 检查文件格式
        if not self.batch_var.get():
            file_ext = Path(input_path).suffix.lower()
            if file_ext not in ['.doc', '.docx']:
                messagebox.showerror("错误", f"不支持的文件格式: {file_ext}\n仅支持.doc和.docx格式")
                return
        
        # 禁用转换按钮
        self.convert_button.config(state='disabled')
        self.progress.start()
        
        # 在新线程中执行转换
        thread = threading.Thread(target=self.convert_worker, args=(input_path, output_path))
        thread.daemon = True
        thread.start()
    
    def convert_worker(self, input_path, output_path):
        """转换工作线程"""
        try:
            # 确定使用哪个转换引擎
            engine = self.engine_var.get()
            use_pandoc = None
            if engine == 'pandoc':
                use_pandoc = True
            elif engine == 'builtin':
                use_pandoc = False
            # auto模式让转换器自动选择
            
            engine_name = {
                'auto': '自动选择',
                'pandoc': 'Pandoc',
                'builtin': '内置转换器'
            }.get(engine, engine)
            
            self.log(f"开始转换（使用{engine_name}）...")
            
            if self.batch_var.get():
                # 批量转换
                self.log(f"批量转换模式：处理目录 {input_path}")
                self.converter.batch_convert(input_path, output_path, use_pandoc)
            else:
                # 单文件转换
                self.log(f"单文件转换：{input_path}")
                
                # 设置输出文件路径
                if output_path:
                    output_file = os.path.join(output_path, f"{Path(input_path).stem}.md")
                else:
                    output_file = None
                
                result_file = self.converter.convert_document_to_markdown(input_path, output_file, use_pandoc)
                self.log(f"转换完成：{result_file}")
            
            # 转换完成
            self.root.after(0, self.conversion_complete, True, "转换成功完成！")
            
        except Exception as e:
            error_msg = f"转换失败：{str(e)}"
            self.log(error_msg)
            
            # 提供针对性的解决建议
            if ".doc" in str(e).lower() and "无法转换" in str(e):
                error_msg += "\n\n💡 .doc文件转换建议：\n"
                error_msg += "1. 安装LibreOffice（免费）\n"
                error_msg += "2. 手动将.doc另存为.docx格式\n"
                error_msg += "3. 点击'安装指南'查看详细说明"
            elif "pandoc" in str(e).lower():
                error_msg += "\n💡 提示：可能需要安装Pandoc，点击'安装指南'查看详情"
            
            self.root.after(0, self.conversion_complete, False, error_msg)
    
    def conversion_complete(self, success, message):
        """转换完成回调"""
        self.progress.stop()
        self.convert_button.config(state='normal')
        
        if success:
            messagebox.showinfo("成功", message)
        else:
            messagebox.showerror("失败", message)
    
    def run(self):
        """运行GUI"""
        self.root.mainloop()


def main():
    """主函数"""
    app = Word2MarkdownGUI()
    app.run()


if __name__ == "__main__":
    main() 